package org.test.demo.redisdemo;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
import org.lion.util.StringUtil;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class RedisDemo {
	JedisPool pool;
	Jedis jedis;
	Logger log = Logger.getLogger(RedisDemo.class);

	@Before
	public void setUp() throws Exception {
		pool = new JedisPool(new JedisPoolConfig(), "127.0.0.1");
		jedis = pool.getResource();
	}

	@Test
	public void test() {
		// fail("Not yet implemented");
	}

	/**
	 * 
	 * 通过key获取value 2017-6-28-下午4:15:43 作者：张强 void
	 * 
	 * @exception
	 * @since 1.0.0 org.test.demo.redisdemo.RedisDemo.java
	 */
	@Test
	public void testGet() {
		// TODO Auto-generated method stub
		String s = jedis.get("name");
		log.info(s + "- 是否为空：" + StringUtil.isEmpty(s));
	}

	/**
	 * 
	 * 初级数据类型：字符串 2017-6-28-下午4:18:56 作者：张强 void
	 * 
	 * @exception
	 * @since 1.0.0 org.test.demo.redisdemo.RedisDemo.java
	 */
	@Test
	public void testBasicString() {
		// 添加或修改数据 (如果原来没有key，那么是新增；有了相同的key，那么会修改)
		jedis.set("name", "xi");
		testGet();// 结果xi
		// 追加数据
		jedis.append("name", "你好");
		testGet();// 结果xi你好
		// 删除数据
		jedis.del("name");
		testGet();//
		// 批量设置
		jedis.mset("name", "qiang", "age", "30");
		log.info(jedis.mget("name", "age"));
	}

	/**
	 * 
	 * list集合或队列测试 :数据不排重
	 * 2017-6-28-下午4:42:31 作者：张强 void
	 * 
	 * @exception
	 * @since 1.0.0 org.test.demo.redisdemo.RedisDemo.java
	 */
	@Test
	public void testList() {
		// 放list数据
		// jedis.lpush("javadev", "javase");//添加队列头
		// jedis.lpush("javadev", "spring");
		// jedis.rpush("javadev", "hibernate");//添加队列尾
		// jedis.rpush("javadev", "mybatis");
		// 输出长度
		long len = jedis.llen("javadev");
		log.info("len:" + len);
		// 输出内容
		List<String> list = jedis.lrange("javadev", 0, -1);// -1代表全部
		log.info(list);
		// 出队列头
		jedis.lpop("javadev");
		list = jedis.lrange("javadev", 0, -1);// -1代表全部
		log.info(list);
		// 出队列尾
		jedis.rpop("javadev");
		list = jedis.lrange("javadev", 0, -1);// -1代表全部
		log.info(list);
		//删除
//		jedis.del("javadev");
	}
	/**
	 * 
	 * set集合：具有排重功能
	 * 2017-6-28-下午4:54:11
	 * 作者：张强
	 * void
	 * @exception
	 * @since  1.0.0 org.test.demo.redisdemo.RedisDemo.java
	 */
	@Test
	public void testSet(){
		//添加
		jedis.sadd("db", "mysql");
		jedis.sadd("db", "oracle");
		jedis.sadd("db", "redis");
		jedis.sadd("db", "redis");//自动排重
		jedis.srem("db", "oracle");//删除指定的内容
		log.info(jedis.smembers("db"));
		log.info(jedis.scard("db"));//返回元素个数
		log.info(jedis.sismember("db","redis"));//返回是否包含该元素
		log.info(jedis.smembers("db"));//返回所有元素
		
		
	}
	
	/**
	 * 
	 * map集合
	 * 2017-6-28-下午6:21:18
	 * 作者：张强
	 * void
	 * @exception
	 * @since  1.0.0 org.test.demo.redisdemo.RedisDemo.java
	 */
	@Test
	public void testMap(){
		Map<String,String> user=new HashMap<String,String>(); 
		user.put("name","minxr"); 
		user.put("pwd","password"); 
		jedis.hmset("user",user); 
		//取出user中的name，执行结果:[minxr]-->注意结果是一个泛型的List 
		//第一个参数是存入redis中map对象的key，后面跟的是放入map中的对象的key，后面的key可以跟多个，是可变参数 
		List<String> rsmap = jedis.hmget("user", "name"); 
		System.out.println(rsmap);  
		//删除map中的某个键值 
//		        jedis.hdel("user","pwd"); 
		System.out.println(jedis.hmget("user", "pwd")); //因为删除了，所以返回的是null 
		System.out.println(jedis.hlen("user")); //返回key为user的键中存放的值的个数1 
		System.out.println(jedis.exists("user"));//是否存在key为user的记录 返回true 
		System.out.println(jedis.hkeys("user"));//返回map对象中的所有key  [pwd, name] 
		System.out.println(jedis.hvals("user"));//返回map对象中的所有value  [minxr, password] 
		Iterator<String> iter=jedis.hkeys("user").iterator(); 
		while (iter.hasNext()){ 
		String key = iter.next();                System.out.println(key+":"+jedis.hmget("user",key)); 
		} 
		
	}
	
	@Test 
	public void testOther() throws InterruptedException { 
	//keys中传入的可以用通配符 
	 System.out.println(jedis.keys("*")); //返回当前库中所有的key  [sose, sanme, name, jarorwar, foo, sname, java framework, user, braand] 
	System.out.println(jedis.keys("*name"));//返回的sname   [sname, name] 
	System.out.println(jedis.del("sanmdde"));//删除key为sanmdde的对象  删除成功返回1 删除失败（或者不存在）返回 0 
	System.out.println(jedis.ttl("name"));//返回给定key的有效时间，如果是-1则表示永远有效 
	jedis.setex("timekey", 10, "min");//通过此方法，可以指定key的存活（有效时间） 时间为秒 
	Thread.sleep(5000);//睡眠5秒后，剩余时间将为<=5 
	System.out.println(jedis.ttl("timekey"));   //输出结果为5 
	jedis.setex("timekey", 1, "min");        //设为1后，下面再看剩余时间就是1了 
	System.out.println(jedis.ttl("timekey"));  //输出结果为1 
	System.out.println(jedis.exists("key"));//检查key是否存在             System.out.println(jedis.rename("timekey","time")); 
	System.out.println(jedis.get("timekey"));//因为移除，返回为null 
	System.out.println(jedis.get("time")); //因为将timekey 重命名为time 所以可以取得值 min 
	//jedis 排序 
	//注意，此处的rpush和lpush是List的操作。是一个双向链表（但从表现来看的） 
	jedis.del("a");//先清除数据，再加入数据进行测试 
	jedis.rpush("a", "1"); 
	jedis.lpush("a","6"); 
	jedis.lpush("a","3"); 
	jedis.lpush("a","9"); 
	System.out.println(jedis.lrange("a",0,-1));// [9, 3, 6, 1] 
	System.out.println(jedis.sort("a")); //[1, 3, 6, 9]  //输入排序后结果 
	System.out.println(jedis.lrange("a",0,-1)); 
	}
	
	
	
	
	//压力测试
	

}
